.SILENT:

# ESTE ES EL MAKEFILE PARA UTILIDADES. 
# DEBE EJECUTARSE CON EL COMANDO MAKE. PARA VOLVER EL DIRECTORIO A SU ESTADO ORIGINAL
# UTILIZAR EL COMANDO MAKE CLOSE.
# EN CASO DE QUERER COMPILAR EN MODO SILENCIOSO, EJECUTAR MAKE SILENCE

#DIRECTORIO DONDE SE EJECUTO EL MAKE
MAKE_DIR = $(shell pwd)

#COMPILADOR POR DEFAULT
CC=gcc

# DIRECTIVAS DEL COMPILADOR
CFLAGS=-g -Wall -std=c99 -pedantic

# NOMBRE DEL PROGRAMA PRICIPAL
EXEC=prueba_utilidades

# BIBLIOTECAS PARA EL PROGRAMA PRINCIPAL
SRC=$(wildcard *.c)

# CODIGO OBJETO DE LAS BIBLIOTECAS DEL PROGRAMA PRINCIPAL
OBJS= utilidades.o $(EXEC).o

#Ubicacion de las libs externas
LIBS_DIR = ./termino ../tda/lista/ ../tda/vector_dinamico ../tda/abb_avl/ ../tda/pila/

# CODIGO OBJETO DE LAS DEPENDECIAS EXTERNAS
LIBS= ../tda/lista/lista.o ./termino/termino.o ../tda/vector_dinamico/vector_dinamico.o ../tda/abb_avl/abb_avl.o ../tda/pila/pila.o

# Ruta relativa de los headers
HEADERS_DIR= ../tda/lista/lista.h ./termino/termino.h ../tda/vector_dinamico/vector_dinamico.h ../tda/abb_avl/abb_avl.h ../tda/pila/pila.h

# HEADERS DE LAS DEPENDENCIAS EXTERNAS 
HEADERS=lista.h termino.h vector_dinamico.h abb_avl.h pila.h

# DIRECTIVAS DEL MEM CHECK
VFLAGS= valgrind --leak-check=full --show-reachable=yes --track-origins=yes

# DEFAULT
all: prepare $(EXEC)

# SILENT DEFAULT
silent: sprepare s$(EXEC)

# COMPILA SOLAMENTE EL CODIGO OBJETO
objects: localClean
	cp $(HEADERS_DIR) ./
	$(CC) $(CFLAGS) -c $(SRC) -lm
	rm -f $(HEADERS)
	
# Limpieza Local
localClean:
	rm -f *.o $(EXEC)
	
# COMPILA DEPENDECIAS EXTERNAS
prepare:	
	$(foreach dir,$(LIBS_DIR),\
		cd $(dir);make; \
		cd $(MAKE_DIR);)
	
	cp $(HEADERS_DIR) ./
	
# COMPILA BIBLIOTECAS
%.o: %.c
	$(CC) $(CFLAGS) -c $< 
	echo OK

# CONSTRUYE EL PROGRAMA PRINCIPAL
$(EXEC): prepare $(OBJS)
	$(CC) $(CFLAGS) $(LIBS) $(OBJS) -o $(EXEC)

# LIMPIA EL DIRECTORIO BASE
clean:
	$(foreach dir,$(LIBS_DIR),\
		cd $(dir);make clean; \
		cd $(MAKE_DIR);)
	rm -f *.o $(EXEC) $(HEADERS)
	
# CORRE EL PROGRAMA PRINCIPAL
run: $(EXEC)
	./$(EXEC)

# CORRE PRUEBAS DE MEMORIA SOBRE EL PROGRAMA PRINCIPAL
test: $(EXEC)
	$(VFLAGS) ./$(EXEC)
	
# LIMPIA LOS DIRECTORIOS DE LAS DEPENDENCIAS EXTERNAS
close: clean
	$(foreach dir,$(LIBS_DIR),\
		cd $(dir);make close; \
		cd $(MAKE_DIR);)
	rm -f *.o $(EXEC) $(HEADERS)

	
# SILENT PREPARE
sprepare: clean
	$(foreach dir,$(LIBS_DIR),\
		cd $(dir);make silent; \
		cd $(MAKE_DIR);)
	
	cp $(HEADERS_DIR) ./

# SILENT %.o
s$(OBJS):
	$(CC) $(CFLAGS) -c $(SRC)

# SILENT $(EXEC)
s$(EXEC): s$(OBJS)
	$(CC) $(CFLAGS) $(LIBS) $(OBJS) $(HEADERS) -o $(EXEC)
